#ifndef PDFNOTES_H
#define PDFNOTES_H

#include <QtGui>
//#include <QtGui/QMainWindow>
//#include <QtGui/QFileDialog>
//#include <QtGui/QMessageBox>
#include <QSettings>
#include <QClipboard>
#include "ui_pdfnotes.h"
#include "fileviewer.h"
#include "notes.h"
#include "printthread.h"
#include "configdialog.h"
#include <poppler-qt4.h>
#include <iostream>
#include <fstream>

/*!
 * Klasa okna aplikacji
 */
class PdfNotes : public QMainWindow {
    Q_OBJECT

public:
    PdfNotes(QWidget *parent = 0);
    ~PdfNotes();

    static const QString ORGNAME;
    static const QString APPNAME;

private:
    Ui::PdfNotesClass ui;

    /*!
     * Dokument pdf
     */
    Poppler::Document *doc;
    /*!
     * Kolekcja notatek dokumentu
     */
    DocumentNotes notes;
    /*!
     * Okno konfiguracji
     */
    ConfigDialog config;

    /*!
     * Ostatnio otwierany dokument
     */
    QString lastPath;
    /*!
     * Obszar zawierajacy wyszukany tekst
     */
    QRectF searchLocation;

    /*!
     * Lista mozliwych skal dla dokumentu
     */
    QStringList scaleFactors;
    /*!
     * Walidator dla kontrolki z nr aktualnie wyswietlanej strony
     * (uzywany przy przejsciu bezposrednio do wybranej strony)
     */
    QIntValidator *pageNoValidator;

    /*!
     * Nr bierzacej strony
     */
    int currentPage;
    /*!
     * Aktualna skala wyswietlania dokumentu
     */
    double currentScale;

    /*!
     * Ograniczenie dla ilosci zachowywanych ostatnio otwieranych dokumentow
     */
    enum {MaxRecentFiles=5};
    /*!
     * Akcje menu dla ostatnio wyswietlanych dokumentow (lista zachowywana w obiekcie QSettings)
     */
    QAction *recentFileActs[MaxRecentFiles];

    /*!
     * Zapisywanie notatek w podanym dokumencie
     */
    void saveNotesToFile(const QString & path);

signals:
	void documentLoaded(Poppler::Document *doc);
	void pageChanged(int currentPage);
	void scaleChanged(double scale);

private slots:
    void on_actionOpen_triggered();
    inline void on_actionReopen_triggered() { openFile(lastPath); }
    void on_actionQuit_triggered();
    void on_actionClearRecent_triggered();
    void on_actionCopy_triggered();
    void on_actionAbout_triggered();
    void on_actionZoom_in_triggered();
    void on_actionZoom_out_triggered();
    inline void on_actionFind_triggered() { ui.searchLine->setFocus(); }
    void on_actionFitWidth_triggered();
    void on_actionFitPage_triggered();
    void on_actionPrint_triggered();
    void on_actionSave_triggered();
    void on_actionSave_as_triggered();
    void on_actionConfigure_triggered();
    inline void on_actionFirst_page_triggered() { setPage(0); }
    inline void on_actionLast_page_triggered() { if (doc) setPage(doc->numPages()-1); }

    void nextPage();
    void prevPage();
    void on_currentPageBox_returnPressed();
    void on_scaleComboBox_activated(const QString &text);
    inline void on_actionNotes_toggled(bool t) { if (t) uncheckOthers(ui.actionNotes); }
    inline void on_actionRectangle_toggled(bool t) { if (t) uncheckOthers(ui.actionRectangle); }
    inline void on_actionSelect_all_triggered() { uncheckOthers(ui.actionSelect_all); }
    void on_actionSelection_toggled(bool t);
    inline void on_searchLine_returnPressed() { searchDocument(); }
    inline void on_searchFwd_clicked() { searchDocument(); }
    inline void on_searchBwd_clicked() { searchDocument(true); }

    void openRecentFile();
    void setPage(int pageNo=0);
    void searchDocument(bool backwards=false);
    void textNoteAdded(TextNote *note);
    void rectNoteAdded(RectNote *note);
    void notesChanged();
    void areaSelected(QRectF rect);


    //searching document
    QRectF searchForwards(const QString &);
    QRectF searchBackwards(const QString &);

private:
    /*!
     * Otwieranie dokumentu
     */
    void openFile(const QString &path);
    /*!
     * Przeliczenie skali dla opcji 'dopasuj strone'
     */
    double calcScaleFitPage();
    /*!
     * Przeliczenie skali dla opcji 'dopasuj szerokosc'
    */
    double calcScaleFitWidth();
    /*!
     * Wyswietlenie wybranej strony (domyslnie ponowne wysw. aktualnej)
     */
    void showPage(int pageNo=-1);

    /*!
     * Odblokowanie akcji po otwarciu dokumentu
     */
    void enableActions();

    /*!
     * Obsluga akcji wzajemnie wykluczajacych sie
     */
    void uncheckOthers(QAction *);
    /*!
     * Wzajemnie wykluczajace sie akcje
     */
    QSet<QAction *> exclusiveActions;

    QMatrix matrix() const;

    /*!
     * Aktualizacja listy ostatnio otwieranych dokumentow
     */
    void updateRecentFiles(const QString &filepath);

};

#endif // PDFNOTES_H
